package log

import (
	"os"
	"path/filepath"
	"time"

	"go.uber.org/zap"
	"go.uber.org/zap/zapcore"
	"gopkg.in/natefinch/lumberjack.v2"
)

var Logger *zap.Logger

// 获取按日期划分的日志文件名（如 ./logs/2023-10-01/app.log）
func getDatedLogPath() string {
	logDir := "./logs"                         // 日志根目录
	dateDir := time.Now().Format("2006-01-02") // 按天创建子目录
	fullDir := filepath.Join(logDir, dateDir)

	// 确保目录存在
	if err := os.MkdirAll(fullDir, 0755); err != nil {
		panic(err)
	}

	return filepath.Join(fullDir, "app.log") // 返回完整路径
}

// 初始化 Zap Logger
func InitLogger() {
	// 配置 lumberjack 按天滚动
	lumberjackLogger := &lumberjack.Logger{
		Filename:   getDatedLogPath(), // 动态生成日志路径
		MaxSize:    100,               // 每个日志文件最大大小（MB）
		MaxBackups: 30,                // 保留旧日志文件的最大数量
		MaxAge:     30,                // 保留旧日志文件的最大天数
		Compress:   true,              // 是否压缩旧日志
	}

	// Zap 编码配置
	encoderConfig := zap.NewProductionEncoderConfig()
	encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder // 时间格式

	// 核心配置：同时输出到文件和控制台
	core := zapcore.NewTee(
		zapcore.NewCore(
			zapcore.NewJSONEncoder(encoderConfig), // JSON 格式
			zapcore.AddSync(lumberjackLogger),     // 写入文件
			zap.InfoLevel,                         // 日志级别
		),
		zapcore.NewCore(
			zapcore.NewConsoleEncoder(encoderConfig), // 控制台格式
			zapcore.AddSync(os.Stdout),               // 输出到终端
			zap.DebugLevel,                           // 控制台显示更详细日志
		),
	)
	// 创建 Logger
	Logger = zap.New(core, zap.AddCaller())
}
